package com.imy.virtual.server.notification;

import android.content.Context;
import android.os.Build;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;

import com.imy.virtual.helper.utils.OSUtils;

class WidthCompat {
   private final static String TAG = WidthCompat.class.getSimpleName();
   private volatile int mWidth = 0;
   public int getNotificationWidth(Context context, int width, int height, int padding) {
       if (mWidth > 0) {
           return mWidth;
       }
       int w = getDefaultWidth(width, padding);
       if (OSUtils.getInstance().isEmui()) {
           w = getEMUINotificationWidth(context, width, height);
       } else if (OSUtils.getInstance().isMiui()) {
           if (Build.VERSION.SDK_INT >= 21) {
               padding = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f,
                       context.getResources().getDisplayMetrics()));
               w = getMIUINotificationWidth(context, width - padding * 2, height);
           } else {
               padding = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25f,
                       context.getResources().getDisplayMetrics()));
               w = getMIUINotificationWidth(context, width - padding * 2, height);
           }
       }
       mWidth = w;
       return w;
   }
   private int getDefaultWidth(int width, int padding) {
       if (Build.VERSION.SDK_INT >= 21)
           return width - padding * 2;
       return width;
   }
   private int getMIUINotificationWidth(Context context, int width, int height) {
       try {
           Context systemUi = context.createPackageContext(NotificationCompat.SYSTEM_UI_PKG,
                   Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
           int layoutId = getSystemId(systemUi, "status_bar_notification_row", "layout");
           if (layoutId != 0) {
               ViewGroup viewGroup = createViewGroup(systemUi, layoutId);
               int lid = getSystemId(systemUi, "adaptive", "id");
               if (lid == 0) {
                   lid = getSystemId(systemUi, "content", "id");
               } else {
                   View child = viewGroup.findViewById(lid);
                   if (child != null && child instanceof ViewGroup) {
                       ((ViewGroup) child).addView(new View(systemUi));
                   }
               }
               layout(viewGroup, width, height);
               if (lid != 0) {
                   View child = viewGroup.findViewById(lid);
                   if (child != null) {
                       return width - child.getLeft() - child.getPaddingLeft() - child.getPaddingRight();
                   }
               } else {
                   int count = viewGroup.getChildCount();
                   for (int i = 0; i < count; i++) {
                       View child = viewGroup.getChildAt(i);
                       if (FrameLayout.class.isInstance(child) || "LatestItemView".equals(child.getClass().getName())
                               || "SizeAdaptiveLayout".equals(child.getClass().getName())) {
                           return width - child.getLeft() - child.getPaddingLeft() - child.getPaddingRight();
                       }
                   }
               }
           }
       } catch (Exception e) {
       }
       return width;
   }
   private int getEMUINotificationWidth(Context context, int width, int height) {
       try {
           Context systemUi = context.createPackageContext(NotificationCompat.SYSTEM_UI_PKG,
                   Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
           int layoutId = getSystemId(systemUi, "time_axis", "layout");
           if (layoutId != 0) {
               ViewGroup viewGroup = createViewGroup(systemUi, layoutId);
               layout(viewGroup, width, height);
               int lid = getSystemId(systemUi, "content_view_group", "id");
               if (lid != 0) {
                   View child = viewGroup.findViewById(lid);
                   return width - child.getLeft() - child.getPaddingLeft() - child.getPaddingRight();
               } else {
                   int count = viewGroup.getChildCount();
                   for (int i = 0; i < count; i++) {
                       View child = viewGroup.getChildAt(i);
                       if (LinearLayout.class.isInstance(child)) {
                           return width - child.getLeft() - child.getPaddingLeft() - child.getPaddingRight();
                       }
                   }
               }
           }
       } catch (Exception e) {
       }
       return width;
   }
   private int getSystemId(Context systemUi, String name, String type) {
       return systemUi.getResources().getIdentifier(name, type, NotificationCompat.SYSTEM_UI_PKG);
   }
   private ViewGroup createViewGroup(Context context, int layoutId) {
       try {
           return (ViewGroup) LayoutInflater.from(context).inflate(layoutId, null);
       } catch (Throwable e) {
       }
       return new FrameLayout(context);
   }
   private void layout(View view, int width, int height) {
       view.layout(0, 0, width, height);
       view.measure(View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.AT_MOST),
               View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST));
       view.layout(0, 0, width, height);
   }
}
